﻿namespace LogicStudio.Framework.Excepciones
{
    using System;
    using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
    using Utilidades;

    /// <summary>
    /// Clase estática manejadora de excepciones
    /// </summary>
    public static class ControladorExcepciones
    {
        #region Métodos Publicos Estáticos

        /// <summary>
        /// Método de generación de tablas de registro de excepciones
        /// </summary>
        private static void GenerarTablas()
        {
            try
            {
                using (var contextoFramework = new ContextoFramework())
                {
                    contextoFramework.ExecuteStoreCommand(ContenedorScript.Excepciones);
                }
            }
            catch (Exception exception)
            {
                Procesar(exception);
            }
        }

        /// <summary>
        /// Método que procesa las excepciones
        /// </summary>
        /// <param name="excepcion">Excepción producida</param>
        /// <param name="politica">Politica que procesara la excepción</param>
        public static void Procesar(Exception excepcion, string politica)
        {
            GenerarTablas();
            var reThrow = ExceptionPolicy.HandleException(excepcion, politica);
            if (reThrow)
            {
                throw excepcion;
            }
        }

        /// <summary>
        /// Método que procesa las excepciones
        /// </summary>
        /// <param name="excepcion">Excepción producida</param>
        /// <param name="politica">Politica que procesara la excepción</param>
        /// <param name="reenviar">
        /// Indica si se debe o no reenviar la excepción actual<br/>
        /// En el caso de indicar que si se desea reenviar la excepción,
        /// primeramente se valida si la politica tiene habilitado la opción
        /// </param>
        public static void Procesar(Exception excepcion, string politica, bool reenviar)
        {
            try
            {
                GenerarTablas();
                var reThrow = ExceptionPolicy.HandleException(excepcion, politica);
                if (reenviar && reThrow)
                {
                    throw excepcion;
                }
            }
            catch
            {
                return;
            }
        }

        public static void Procesar(Exception excepcion, bool reenviar)
        {
            try
            {
                GenerarTablas();
                string politica = (excepcion.GetType().Equals(typeof(ExcepcionAccesoDatos))) ? Recursos.PoliticaAccesoDatos : Recursos.PoliticaServicios;
                var reThrow = ExceptionPolicy.HandleException(excepcion, politica);
                if (reenviar && reThrow)
                {
                    throw excepcion;
                }
            }
            catch
            {
                return;
            }
        }

        /// <summary>
        /// Método que procesa las excepciones
        /// </summary>
        /// <param name="excepcion"></param>
        public static void Procesar(Exception excepcion)
        {
            if (excepcion.GetType().Equals(typeof(ExcepcionAccesoDatos)))
            {
                Procesar(excepcion, Recursos.PoliticaAccesoDatos);
            }
            else if (excepcion.GetType().Equals(typeof(ExcepcionServicios)))
            {
                Procesar(excepcion, Recursos.PoliticaServicios);
            }
        }

        #endregion
    }
}